{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "c479e510",
   "metadata": {},
   "source": [
    "# 第四周汇报"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "822ab1ae",
   "metadata": {},
   "source": [
    "## 1、强化学习相关知识\n",
    "## 2、DGL学习"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "06d707f5",
   "metadata": {},
   "source": [
    "# 一、强化学习"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e58de235",
   "metadata": {},
   "source": [
    "## 黎曼和式积分（Reimann Sum）"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "68004629",
   "metadata": {},
   "source": [
    "- 积分即是求面积（求和）"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3a9fe1df",
   "metadata": {},
   "source": [
    "$$\n",
    "\\begin{split}\n",
    "&\\int_a^bf(x)dx=\\lim_{n\\to \\infty}\\sum_{i=1}^nf(x_i)\\Delta x\\\\\n",
    "&\\Delta x=\\frac{b-a}n\\\\\n",
    "&x_i=a+\\frac{b-a}n\\cdot (i-1)\n",
    "\\end{split}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b725e446",
   "metadata": {},
   "source": [
    "例："
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7b3473a1",
   "metadata": {},
   "source": [
    "$$\n",
    "\\int_\\pi^{2\\pi}\\cos(x)dx=\\sum_{i=1}^n\\cos(\\pi+\\frac{\\pi}n\\cdot i)\\frac{2\\pi-\\pi}n=\\sum_{i=1}^n\\cos(\\pi+\\frac{\\pi}n\\cdot i)\\frac{\\pi}n\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "id": "b8a65bb8",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "\n",
    "def cos(x):\n",
    "    return np.cos(x)\n",
    "\n",
    "def reimann_sum(f, a, b, N=1000):\n",
    "    total_sum = 0\n",
    "    for i in range(1, N+1):\n",
    "        total_sum += f(a+(b-a)/N*i)\n",
    "    return (b-a)/N*total_sum"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "id": "fa78f11f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3.141592653553481e-05"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reimann_sum(cos, np.pi, 2*np.pi, N=100000)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ecd4e9a9",
   "metadata": {},
   "source": [
    "$$\\sum_{i=1}^n\\ln(2+\\frac{5i}n)\\frac{5}{n}$$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1d13c0de",
   "metadata": {},
   "source": [
    "- 由和式积分到原始积分\n",
    "- $\\frac{5}n=\\frac{b-a}n$\n",
    "- $2+\\frac{5i}n=a+\\frac{b-a}ni$\n",
    "- $b-a=5, a=2 => b=7$\n",
    "$$\n",
    "\\int_2^7\\ln(x)dx\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "id": "44e5c20c",
   "metadata": {},
   "outputs": [],
   "source": [
    "def ln(x):\n",
    "    return np.log(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "id": "0457a4af",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "7.235108001267132"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reimann_sum(ln, 2, 7, N=100000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "id": "f4bff69c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "7.235108001267132"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "5/100000*sum([ln(2+5*i/100000) for i in range(1, 100000+1)])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "828d28d2",
   "metadata": {},
   "source": [
    "## 期望"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ce7053b1",
   "metadata": {},
   "source": [
    "$$\n",
    "\\begin{split}\n",
    "\\mathbb{E}(f(x))&=\\int f(x)p(x)dx\\\\\n",
    "&=\\lim_{N\\to \\infty}\\frac1N\\sum_{i=1}^Nf(x_i)_{x_i\\sim p(x)}\n",
    "\\end{split}\\\\\n",
    "\\begin{split}\n",
    "\\mathbb{E}(x)&=\\int xp(x)dx\\\\\n",
    "&=\\lim_{N\\to \\infty}\\frac1N\\sum_{i=1}^Nx_i{_{x_i\\sim p(x)}}\n",
    "\\end{split}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5765da8c",
   "metadata": {},
   "source": [
    "## 1.1、蒙特卡洛方法"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e3e38fa2",
   "metadata": {},
   "source": [
    "蒙特卡洛方法是通过随机样本来估测真实值，举个例子，计算Π的数值"
   ]
  },
  {
   "attachments": {
    "image-2.png": {
     "image/png": "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"
    }
   },
   "cell_type": "markdown",
   "id": "cce0a70a",
   "metadata": {},
   "source": [
    "![image-2.png](attachment:image-2.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b7b2d0ab",
   "metadata": {},
   "source": [
    "样本落在圆里面的概率就是圆的面积除正方形面积"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "id": "fa73f2a7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Pi =  3.1409715704857852\n"
     ]
    }
   ],
   "source": [
    "import random\n",
    "import math\n",
    " \n",
    "icount = 0\n",
    "iter = 2000000\n",
    "\n",
    "for i in range(iter):\n",
    "    x = random.random()\n",
    "    y = random.random()\n",
    " \n",
    "    if math.sqrt(x**2 + y**2) <= 1:\n",
    "        icount += 1\n",
    "print('Pi = ', float(4*icount)/float(i))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8e0febd3",
   "metadata": {},
   "source": [
    "## 1.2、重要性采样"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "98971619",
   "metadata": {},
   "source": [
    "### 1.2.1、理论部分"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dcc27c70",
   "metadata": {},
   "source": [
    "- 计算 $f(x)$ w.r.t $p(x)$（distribution） 的期望 f(x)是关于p(x)的概率分布\n",
    "\n",
    "$$\n",
    "\\langle f \\rangle_{p} =\\int f(x)p(x)dx\n",
    "$$\n",
    "\n",
    "- 在一些场景下，很难求其解析解形式，所以要转向数值解，\n",
    "    - 如果可以正确地在 $p(x)$ 中进行采样，假如采样 $N$ 次，得到 $N$ 个样本：$x_1,x_2,\\cdots,x_N$\n",
    "\n",
    "$$\n",
    "\\langle f \\rangle_{p} \\approx \\frac{1}{N}\\sum_i f(x_i)_{x_i\\sim p(x)}\n",
    "$$\n",
    "\n",
    "- 现在的问题在于 $p(x)$ 很难被采样，这个时候引入 $q(x)$（也是一个概率分布，容易被采样）来间接地计算：\n",
    "    - $q(x)$：称为重要性分布（importance distribution），所谓的重要性采样，即是从这样一个简单的重要性分布中进行采样\n",
    "        - 从 $q(x)$ 采样 $N$ 次，得到 $N$ 个样本：$x_1,x_2,\\cdots,x_N$\n",
    "    - $w(x)=\\frac{p(x)}{q(x)}$：称为 importance weight 重要性权重\n",
    "$$\n",
    "\\begin{split}\n",
    "\\langle f \\rangle_{p}&=\\int f(x)\\frac{p(x)}{q(x)}q(x)dx\\\\\n",
    "&=\\int f(x)w(x)q(x)dx, \\qquad w(x)=\\frac{p(x)}{q(x)}\\\\\n",
    "&=\\langle f\\cdot w\\rangle_q\\\\\n",
    "&\\approx\\frac{1}{N}\\sum_i^Nf(x_i)w(x_i)_{x_i\\sim q(x)}\n",
    "\\end{split}\n",
    "$$\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1301b38c",
   "metadata": {},
   "source": [
    "### 1.2.2、实现"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "1f63d545",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from scipy.special import logsumexp"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5859d806",
   "metadata": {},
   "source": [
    "- 正态分布与均匀分布\n",
    "    - $f(x) = \\frac{1}{\\sigma \\sqrt{2\\pi} } e^{-\\frac{1}{2}\\left(\\frac{x-\\mu}{\\sigma}\\right)^2}$\n",
    "    \n",
    "        - $\\log f(x)=-\\frac12\\left(\\frac{x-\\mu}{\\sigma}\\right)^2$\n",
    "    \n",
    "    - $f(x)=\\frac{1}{b-a}$\n",
    "    \n",
    "        - $\\log f(x)=-\\log (b-a)$\n",
    "    \n",
    "- $w_i=\\frac{p(x_i)}{q(x_i)}, \\log w_i=\\log p(x_i)-\\log q(x_i)$\n",
    "    - $w_i=\\frac{\\exp(w_i)}{\\sum_j\\exp(w_j)}$  :为了加权之后和为1\n",
    "    - $\\log w_i=w_i-\\log\\sum_j\\exp(w_j)$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "822fea29",
   "metadata": {},
   "outputs": [],
   "source": [
    "class Pdf:\n",
    "    def __call__(self, x):\n",
    "        '''log prob'''\n",
    "        pass\n",
    "    def sample(self, n):\n",
    "        pass\n",
    "\n",
    "# 待估计的分布\n",
    "class Norm(Pdf):\n",
    "    def __init__(self, mu=0, sigma=1):\n",
    "        self.mu = mu\n",
    "        self.sigma = sigma\n",
    "        \n",
    "    def __call__(self, x):\n",
    "        return -0.5*(x-self.mu)**2/self.sigma**2\n",
    "    \n",
    "    # 不会被调用\n",
    "    def sample(self, n):\n",
    "        return np.random.normal(self.mu, self.sigma, n)\n",
    "\n",
    "# 重要性分布\n",
    "class Uniform(Pdf):\n",
    "    def __init__(self, low, high):\n",
    "        self.low = low\n",
    "        self.high = high\n",
    "    def __call__(self, x):\n",
    "        return np.repeat(-np.log(self.high - self.low), len(x))\n",
    "    def sample(self, n):\n",
    "        return np.random.uniform(self.low, self.high, n)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "5b8c5367",
   "metadata": {},
   "outputs": [],
   "source": [
    "class ImportanceSampler:\n",
    "    def __init__(self, p_dist, q_dist):\n",
    "        self.p_dist = p_dist\n",
    "        self.q_dist = q_dist\n",
    "        \n",
    "    def sample(self, n):\n",
    "        samples = self.q_dist.sample(n)\n",
    "        weights = self.calc_weights(samples)\n",
    "        norm_weights = weights - logsumexp(weights)\n",
    "        return samples, norm_weights\n",
    "    def calc_weights(self, samples):\n",
    "        # log(p(x)/q(x)) = log(p) - log(q)\n",
    "        return self.p_dist(samples) - self.q_dist(samples)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "id": "ab4e1660",
   "metadata": {},
   "outputs": [],
   "source": [
    "N = 200000\n",
    "target_p = Norm()\n",
    "imp_q = Uniform(-30, 30)\n",
    "sampler = ImportanceSampler(target_p, imp_q)\n",
    "biased_samples, logws = sampler.sample(N)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "id": "5d351e07",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "samples = np.random.choice(biased_samples, N, p=np.exp(logws))\n",
    "_ = plt.hist(samples, bins=50)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b0505b64",
   "metadata": {},
   "source": [
    "### 1.2.3、接收/拒绝采样"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e4d5a75d",
   "metadata": {},
   "source": [
    "- 也叫 accept/reject algorithm\n",
    "    - 一种采样 sampling method\n",
    "- 采样效率（sample efficiency）：接受率的问题"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "af6b5e90",
   "metadata": {},
   "source": [
    "$$\n",
    "p(x), \\quad q(x)\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "71414f2d",
   "metadata": {},
   "source": [
    "- monte carlo （计算机随机采样）的方式估计未知（不知解析解）分布"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "341c3822",
   "metadata": {},
   "source": [
    "例子：$f(x)=1.2-x^4$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "id": "d359b772",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x22b5423deb0>"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def f(x):\n",
    "    return 1.2 - x**4\n",
    "\n",
    "xs = np.linspace(0, 1, 1000)\n",
    "ys = f(xs)\n",
    "\n",
    "plt.plot(xs, ys, label=\"$f(x)=1.2-x^4$\") \n",
    "plt.fill_between(xs, ys, 0, alpha=0.2)\n",
    "plt.xlim(0, 1)\n",
    "plt.ylim(0, 1.25)\n",
    "plt.xlabel(\"x\")\n",
    "plt.ylabel(\"y\")\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "id": "d346e6f7",
   "metadata": {},
   "outputs": [],
   "source": [
    "def sample(f, xmin=0, xmax=1, ymax=1.2):\n",
    "    while True:\n",
    "        x = np.random.uniform(low=xmin, high=xmax)\n",
    "        y = np.random.uniform(low=0, high=ymax)\n",
    "        if y < f(x):\n",
    "            return x\n",
    "samples = [sample(f, ) for _ in range(100000)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "id": "e6a696b4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x22b545b51c0>"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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yGUxCBEREZHLYhAiIiIil8UgRERERC6LQYiIiIhcFoMQERERuSwGISIiInJZDEJERETkshiEiIiIyGUxCBEREZHLYhAiIiIil8UgRERERC6LQYiIiIhcFoMQERERuSwGISIiInJZDEJERETkshiEiIiIyGUxCBEREZHLYhAiIiIil8UgRERERC6LQYiIiIhcFoMQERERuSwGISIiInJZDEJERETkshiEiIiIyGU5RBBasGABIiIioNFoEB8fj127dl21/TfffIOoqChoNBpER0dj3bp1dqqUiIiInInkQWjFihVISUnBzJkzsWfPHsTExCApKQmlpaVNtt+xYwfGjh2Lhx56CHv37sWIESMwYsQIHDx40M6VExERUUsniKIoSllAfHw8evfujffffx8AYDabodVq8fTTT2Pq1KmXtR8zZgyqq6vx448/WrbdeuutiI2NxeLFi695PJ1OBx8fH6Rnp8PTy9N6b4SIiIhspqqyCrdF3YaKigp4e3tb7XUVVnulG6DX65GZmYlp06ZZtslkMiQmJiIjI6PJfTIyMpCSktJoW1JSEtasWdNk+/r6etTX11ueV1RUAACqq6pvsnoiIiKyl4u/t63dfyNpECorK4PJZEJQUFCj7UFBQcjOzm5yn+Li4ibbFxcXN9k+NTUVr7322mXbh/UadoNVExERkVTOnj0LHx8fq72epEHIHqZNm9aoB6m8vBzh4eHIz8+36jeSmk+n00Gr1aKgoMCq3Zx0Y3g+HAfPhePguXAcFRUVCAsLg7+/v1VfV9IgFBAQALlcjpKSkkbbS0pKEBwc3OQ+wcHBzWqvVquhVqsv2+7j48N/1A7C29ub58KB8Hw4Dp4Lx8Fz4ThkMuve5yXpXWMqlQpxcXFIS0uzbDObzUhLS0NCQkKT+yQkJDRqDwAbN268YnsiIiKiK5H80lhKSgomTpyIXr16oU+fPpg3bx6qq6sxadIkAMCECRPQpk0bpKamAgCeeeYZDBw4EHPmzMGwYcOwfPly7N69G0uWLJHybRAREVELJHkQGjNmDM6cOYMZM2aguLgYsbGx2LBhg2VAdH5+fqNusL59++Krr77CK6+8gpdeegkdOnTAmjVr0K1bt+s6nlqtxsyZM5u8XEb2xXPhWHg+HAfPhePguXActjoXks8jRERERCQVyWeWJiIiIpIKgxARERG5LAYhIiIiclkMQkREROSynDIILViwABEREdBoNIiPj8euXbuu2v6bb75BVFQUNBoNoqOjsW7dOjtV6vyacy6WLl2KAQMGwM/PD35+fkhMTLzmuaPmae7PxkXLly+HIAgYMWKEbQt0Ic09F+Xl5Zg8eTJCQkKgVqvRsWNH/l9lJc09F/PmzUOnTp3g5uYGrVaLKVOmoK6uzk7VOq8tW7YgOTkZoaGhEAThimuI/ll6ejp69uwJtVqN9u3b45NPPmn+gUUns3z5clGlUokfffSReOjQIfGRRx4RfX19xZKSkibbb9++XZTL5eLbb78tHj58WHzllVdEpVIpHjhwwM6VO5/mnotx48aJCxYsEPfu3SseOXJEfOCBB0QfHx/x1KlTdq7cOTX3fFyUl5cntmnTRhwwYIB4zz332KdYJ9fcc1FfXy/26tVLHDp0qLht2zYxLy9PTE9PF7OysuxcufNp7rn48ssvRbVaLX755ZdiXl6e+NNPP4khISHilClT7Fy581m3bp348ssvi999950IQFy9evVV2+fm5oru7u5iSkqKePjwYXH+/PmiXC4XN2zY0KzjOl0Q6tOnjzh58mTLc5PJJIaGhoqpqalNth89erQ4bNiwRtvi4+PFxx57zKZ1uoLmnou/MhqNopeXl/jpp5/aqkSXciPnw2g0in379hU//PBDceLEiQxCVtLcc7Fo0SIxMjJS1Ov19irRZTT3XEyePFm8/fbbG21LSUkR+/XrZ9M6Xc31BKEXXnhB7Nq1a6NtY8aMEZOSkpp1LKe6NKbX65GZmYnExETLNplMhsTERGRkZDS5T0ZGRqP2AJCUlHTF9nR9buRc/FVNTQ0MBoPVF9hzRTd6PmbNmoXAwEA89NBD9ijTJdzIufj++++RkJCAyZMnIygoCN26dcPs2bNhMpnsVbZTupFz0bdvX2RmZloun+Xm5mLdunUYOnSoXWqmS6z1+1vymaWtqaysDCaTyTIr9UVBQUHIzs5ucp/i4uIm2xcXF9usTldwI+fir1588UWEhoZe9g+dmu9Gzse2bduwbNkyZGVl2aFC13Ej5yI3Nxe//PIL7r//fqxbtw45OTl48sknYTAYMHPmTHuU7ZRu5FyMGzcOZWVl6N+/P0RRhNFoxOOPP46XXnrJHiXTn1zp97dOp0NtbS3c3Nyu63WcqkeInMdbb72F5cuXY/Xq1dBoNFKX43IqKysxfvx4LF26FAEBAVKX4/LMZjMCAwOxZMkSxMXFYcyYMXj55ZexePFiqUtzOenp6Zg9ezYWLlyIPXv24LvvvsPatWvx+uuvS10a3SCn6hEKCAiAXC5HSUlJo+0lJSUIDg5ucp/g4OBmtafrcyPn4qJ3330Xb731FjZt2oTu3bvbskyX0dzzceLECZw8eRLJycmWbWazGQCgUChw9OhRtGvXzrZFO6kb+dkICQmBUqmEXC63bOvcuTOKi4uh1+uhUqlsWrOzupFzMX36dIwfPx4PP/wwACA6OhrV1dV49NFH8fLLLzdaG5Ns60q/v729va+7Nwhwsh4hlUqFuLg4pKWlWbaZzWakpaUhISGhyX0SEhIatQeAjRs3XrE9XZ8bORcA8Pbbb+P111/Hhg0b0KtXL3uU6hKaez6ioqJw4MABZGVlWR533303Bg0ahKysLGi1WnuW71Ru5GejX79+yMnJsYRRADh27BhCQkIYgm7CjZyLmpqay8LOxYAqculOu7La7+/mjeN2fMuXLxfVarX4ySefiIcPHxYfffRR0dfXVywuLhZFURTHjx8vTp061dJ++/btokKhEN99913xyJEj4syZM3n7vJU091y89dZbokqlEletWiUWFRVZHpWVlVK9BafS3PPxV7xrzHqaey7y8/NFLy8v8amnnhKPHj0q/vjjj2JgYKD4xhtvSPUWnEZzz8XMmTNFLy8v8euvvxZzc3PFn3/+WWzXrp04evRoqd6C06isrBT37t0r7t27VwQgzp07V9y7d6/4xx9/iKIoilOnThXHjx9vaX/x9vnnn39ePHLkiLhgwQLePn/R/PnzxbCwMFGlUol9+vQRf/vtN8vXBg4cKE6cOLFR+5UrV4odO3YUVSqV2LVrV3Ht2rV2rth5NedchIeHiwAue8ycOdP+hTup5v5s/BmDkHU191zs2LFDjI+PF9VqtRgZGSm++eabotFotHPVzqk558JgMIivvvqq2K5dO1Gj0YharVZ88sknxfPnz9u/cCezefPmJn8HXPz+T5w4URw4cOBl+8TGxooqlUqMjIwUP/7442YfVxBF9uURERGRa3KqMUJEREREzcEgRERERC6LQYiIiIhcFoMQERERuSwGISIiInJZDEJERETkshiEiIiIyGUxCBEREZHLYhAiIiIil8UgRERERC6LQYiIiIhcFoMQEbV4Z86cQXBwMGbPnm3ZtmPHDqhUKqSlpUlYGRE5Oi66SkROYd26dRgxYgR27NiBTp06ITY2Fvfccw/mzp0rdWlE5MAYhIjIaUyePBmbNm1Cr169cODAAfz+++9Qq9VSl0VEDoxBiIicRm1tLbp164aCggJkZmYiOjpa6pKIyMFxjBAROY0TJ06gsLAQZrMZJ0+elLocImoB2CNERE5Br9ejT58+iI2NRadOnTBv3jwcOHAAgYGBUpdGRA6MQYiInMLzzz+PVatWYd++ffD09MTAgQPh4+ODH3/8UerSiMiB8dIYEbV46enpmDdvHj7//HN4e3tDJpPh888/x9atW7Fo0SKpyyMiB8YeISIiInJZ7BEiIiIil8UgRERERC6LQYiIiIhcFoMQERERuSwGISIiInJZDEJERETkshiEiIiIyGUxCBEREZHLYhAiIiIil8UgRERERC6LQYiIiIhc1v8DF9NKFCExWhMAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(xs, ys, label='$f(x)$')\n",
    "plt.hist(samples, density=True, alpha=.2, label='sample dist', color='green', bins=50)\n",
    "plt.xlim(0, 1)\n",
    "plt.ylim(0, 1.3)\n",
    "plt.xlabel('x')\n",
    "plt.ylabel('y')\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5ed6a669",
   "metadata": {},
   "source": [
    "### batch sample"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "id": "8599a55f",
   "metadata": {},
   "outputs": [],
   "source": [
    "def batch_sample(f, num_samples, xmin=0, xmax=1., ymax=1.2, batch_size=1000):\n",
    "    sampels = []\n",
    "    while len(samples) < num_samples:\n",
    "        xs = np.random.uniform(low=xmin, high=xmax, size=batch_size)\n",
    "        ys = np.random.uniform(low=0, high=ymax, size=batch_size)\n",
    "        sampels.extend(xs[ys < f(xs)].tolist())\n",
    "    return samples[:num_samples]\n",
    "samples = batch_sample(f, num_samples=10000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "id": "6245fc61",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x22b5433f220>"
      ]
     },
     "execution_count": 79,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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HnPnzrV/4U6qob8bf8YgZF0NPRZ79uwRo6OjRbVaLbZq1Up87bXXRKPRaOeqnVNDjkV1dbU4b948sXXr1qJGoxFDQ0PFJ598Urxy5Yr9C3cyv/zyS51/A659/+Pj48UBAwbc0CcyMlJUqVRiq1atxI8//rjB+xVEkWN5RERE5Jqcao4QERERUUMwCBEREZHLYhAiIiIil8UgRERERC6LQYiIiIhcFoMQERERuSwGISIiInJZDEJERETkshiEiIiIyGUxCBEREZHLYhAiIiIil8UgRESN3qVLlxAUFITExETLtj179kClUiE5OVnCyojI0fGmq0TkFDZv3oyxY8diz549aN++PSIjIzFmzBgsWrRI6tKIyIExCBGR05g2bRq2b9+Onj174tixYzhw4ADUarXUZRGRA2MQIiKnUVlZiS5duiAnJwdpaWmIiIiQuiQicnCcI0RETuPcuXPIzc2F2WzG+fPnpS6HiBoBjggRkVMwGAzo3bs3IiMj0b59eyxevBjHjh1DQECA1KURkQNjECIip/D8889j3bp1OHLkCDw9PTFgwABotVps3LhR6tKIyIHx1BgRNXopKSlYvHgxPv/8c3h7e0Mmk+Hzzz/Hzp078d5770ldHhE5MI4IERERkcviiBARERG5LAYhIiIiclkMQkREROSyGISIiIjIZTEIERERkctiECIiIiKXxSBERERELotBiIiIiFwWgxARERG5LAYhIiIiclkMQkREROSy/j841cFjnGZ2XwAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(xs, ys, label='$f(x)$')\n",
    "plt.hist(samples, density=True, alpha=.2, label='sample dist', color='green', bins=60)\n",
    "plt.xlim(0, 1)\n",
    "plt.ylim(0, 1.3)\n",
    "plt.xlabel('x')\n",
    "plt.ylabel('y')\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "6198e6fb",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "157 ms ± 5.14 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n",
      "39.1 µs ± 3.3 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n"
     ]
    }
   ],
   "source": [
    "%timeit [sample(f) for i in range(10000)]\n",
    "%timeit batch_sample(f, 10000)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "54ac57bd",
   "metadata": {},
   "source": [
    "## $p(x)$ vs. $q(x)$"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "05e0412b",
   "metadata": {},
   "source": [
    "$$\n",
    "E_{x\\sim p}f(x)\\approx\\frac1N\\sum_{i=1}^Nf(x^i), \\quad x^i\\sim p(x)\n",
    "$$\n",
    "\n",
    "- 如果我们没办法直接从 $p(x)$ 中采样数据，我们仅可以从 $q(x)$ 中采样数据，$x^i\\sim q(x)$\n",
    "\n",
    "$$\n",
    "\\begin{split}\n",
    "E_{x\\sim p}[f(x)]&=\\int f(x)p(x)dx=\\int f(x)\\underbrace{\\frac{p(x)}{q(x)}}_{\\text{importance weight}}q(x)dx\\\\\n",
    "&=E_{x\\sim q}[f(x)\\frac{p(x)}{q(x)}]\n",
    "\\end{split}\n",
    "$$\n",
    "\n",
    "- 期望相同，但方差不同\n",
    "\n",
    "    $$\n",
    "    E_{x\\sim p}[f(x)]=E_{x\\sim q}[f(x)\\frac{p(x)}{q(x)}]\n",
    "    $$\n",
    "\n",
    "    $$\n",
    "    \\begin{split}\n",
    "    \\text{Var}_{x\\sim q}[f(x)\\frac{p(x)}{q(x)}]&=E_{x\\sim q}[(f(x)\\frac{p(x)}{q(x)})^2]-(E_{x\\sim q}[f(x)\\frac{p(x)}{q(x)}])^2\\\\\n",
    "    &=E_{x\\sim p}[f^2(x)\\frac{p(x)}{q(x)}] - (E_{x\\sim p}[f(x)])^2\n",
    "    \\end{split}\n",
    "    $$\n",
    "- 数值稳定性及采样覆盖率的问题 => TRPO/PPO"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "aa43cffb",
   "metadata": {},
   "source": [
    "实例："
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7b757de2",
   "metadata": {},
   "source": [
    " $p(x) =   e^{-\\frac{x^2}{2}} (sin^2(6+x) + 3cos^2(x)sin^2(4x)+1) $"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0c8a6deb",
   "metadata": {},
   "source": [
    "它的期望 $$\n",
    "\\begin{split}\n",
    "E[p(x)]&=\\int xp(x)dx\\\\\n",
    "\\end{split}\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "id": "9ff7004c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "E(X) = -0.03505726584246364\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import scipy.stats as stats\n",
    "\n",
    "def p(x):\n",
    "    \"\"\" 概率密度函数，作为被积函数 \"\"\"\n",
    "    px = np.exp(-(x**2)/2) * (np.sin(6 + x)**2 + 3 * (np.cos(x)**2) * (np.sin(4 * x)**2) + 1)\n",
    "    # px = 1 / 2 * np.exp(- (x-1) ** 2 /2) # 正太分布可以用来验证，均值是否为1\n",
    "    return px\n",
    "\n",
    "def f(x):\n",
    "    return x\n",
    "\n",
    "q_x = stats.norm(0, 1)  # 这里我们取 q(x) 为标准正态分布\n",
    "\n",
    "\n",
    "def importance_sampling(f,p, n=1000):\n",
    "    \"\"\" 使用重要性采样来估计函数的期望。\n",
    "    Args:\n",
    "        f (function): 目标函数 f(x)\n",
    "        p (function): f服从 p(x) 的分布,p(x)为概率密度函数\n",
    "        n (int): 采样的数量，默认为 1000。\n",
    "\n",
    "    Returns:\n",
    "        float: 估计的期望值 E[f(X)]。\n",
    "    \"\"\"\n",
    "    total_weighted_value = 0\n",
    "    total_weight = 0\n",
    "    for _ in range(n):\n",
    "        x_i = np.random.normal(0, 1)    # 从 q(x) 中采样\n",
    "        W_i = p(x_i) / q_x.pdf(x_i)     # 计算权重 W_i = p(x_i) / q(x_i)\n",
    "        total_weighted_value += f(x_i) * W_i\n",
    "        total_weight += W_i\n",
    "\n",
    "    expected_value = total_weighted_value / total_weight\n",
    "    return expected_value\n",
    "\n",
    "\n",
    "estimated_mean = importance_sampling(f, p, 100000)\n",
    "print(\"E(X) =\", estimated_mean)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "aab243af",
   "metadata": {},
   "source": [
    "## RL: On-policy vs. Off-policy"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bd27ceaa",
   "metadata": {},
   "source": [
    "- On-policy：The agent learned and the agent interacting with the env is the **same**;\n",
    "    - 一边跟环境互动，一边在学习；\n",
    "    $$\n",
    "    \\nabla \\bar R(\\theta)=\\mathbb E_{\\tau\\sim p_\\theta(\\tau)}[R(\\tau)\\nabla \\log p_\\theta(\\tau)]\n",
    "    $$\n",
    "    \n",
    "    - $\\pi_\\theta$ to collect data, when $\\theta$ is updated, we have to sampling training data again;\n",
    "        - 这是一个数据利用效率的问题\n",
    "- Off-policy：The agent learned and the agent interacting with the env is **different**;\n",
    "    - 看别人跟环境互动 (generate demonstration)，再学习；\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "593264a1",
   "metadata": {},
   "source": [
    "# 二、DGL消息传递机制"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "82ece747",
   "metadata": {},
   "source": [
    "## 2.1、图上信息的传播"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "id": "e136a58c",
   "metadata": {},
   "outputs": [],
   "source": [
    "import dgl\n",
    "import networkx as nx\n",
    "import torch as th"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "id": "a17b9fd5",
   "metadata": {},
   "outputs": [],
   "source": [
    "g1 = dgl.graph(([0,0,2,3],[1,3,1,1]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "id": "01c67ed8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Graph(num_nodes=4, num_edges=4,\n",
       "      ndata_schemes={}\n",
       "      edata_schemes={})"
      ]
     },
     "execution_count": 91,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "id": "e668e3cd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "SparseMatrix(indices=tensor([[0, 0, 2, 3],\n",
       "                             [1, 3, 1, 1]]),\n",
       "             values=tensor([1., 1., 1., 1.]),\n",
       "             shape=(4, 4), nnz=4)"
      ]
     },
     "execution_count": 92,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g1.adj()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "id": "ff29683c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[0., 1., 0., 1.],\n",
       "        [0., 0., 0., 0.],\n",
       "        [0., 1., 0., 0.],\n",
       "        [0., 1., 0., 0.]])"
      ]
     },
     "execution_count": 93,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g1.adj().to_dense()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "id": "0a089b91",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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GDx4sIqLixUYGKj4+HitXLnSdCQAqDMUSh+wefNm7dmzh9XdgI+75ZZbVFhYqP79+ys1NVX//d//LXZuA+APKJQ+wG63q3Xr1ho6dKjpKAA81KxZMy1ZskRPPvmkHn/8cf3qV79SdXW16VgA4BEKpZerqanR7NmzNWnSJNlsrKEC/EFAQIBee+01vffee3r//feVnJys06dPm44FANeNQunlVq9erePHjysjI8N0FAB17P7771deXp527typ+Ph47dixw3QkALguFEovl5mZqc6dO+uOO+4wHQVAPejfv7+Ki4sVGhqqfv36admyZaYjAcA1o1B6sYqKCi1cuFDp6emyWCym4wCoJx06dFBBQYGGDBmiUaNG6bXXXmOxDgCfQqH0YkuXLlVZWRmru4FGICwsTAsXLtT06dM1bdo0PfDAA6qqqjIdCwCuisXFn8Fea9SoUTp9+rQKCwtNRwHQgOx2u6ZOnao+ffpo4cKFioqKMh0JAGrFCKWXOn36tJYvX85iHKARSk9P15o1a7R//37Fxsbq008/NR0JAGpFofRS8+bNk8vl0oQJE0xHAWBA3759VVJSooiICCUkJGjx4sWmIwHAZVEovZTdbteIESPUqlUr01EAGNKuXTutW7dOKSkpGjdunF599VUW6wDwShRKL/T555+roKCA6W4ACg0N1bx58/TSSy/phRde0JQpU1RZWWk6FgBcgkLphWbNmqXQ0FCNHj3adBQAXsBqterll1/WnDlztGDBAg0ePFjHjh0zHQsA3Fjl7WVcLpe6du2qPn36aObMmabjAPAymzZt0pgxY2S1WrV48WL17t3bdCQAYITS22zevFm7d+9muhvAj+rTp49KSkrUpk0bJSYm6sMPPzQdCQAolN7GbrcrKipKQ4cONR0FgJdq27at8vPzNWbMGI0fP16vvPIKi3UAGGUzHQD/p6amRrNnz9a9994rm43/awBcXtOmTTVr1ix1795dL774onbs2KH3339fISEhpqMBaIQYofQiq1ev1vHjxzlqEcBVsVgs+u1vf6sFCxbo448/1sCBA3X06FHTsQA0QhRKL2K32xUTE6M+ffqYjgLAh9x1113asGGDTp48qdjYWBUXF5uOBKCRoVB6iYqKCi1YsEAZGRmyWCym4wDwMb169VJJSYk6dOigQYMGafbs2aYjAWhEKJReYunSpSor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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "nx.draw(g1.to_networkx(),with_labels = True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "id": "132f4d86",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'feat': tensor([[1.],\n",
       "        [1.],\n",
       "        [1.],\n",
       "        [1.]])}"
      ]
     },
     "execution_count": 95,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g1.ndata['feat'] = th.ones(4,1)\n",
    "g1.ndata"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "30ff1f4a",
   "metadata": {},
   "source": [
    "消息传递机制主要分为三个部分\n",
    "\n",
    "1.消息产生\n",
    "\n",
    "2.消息聚合\n",
    "\n",
    "3.更新特征"
   ]
  },
  {
   "attachments": {
    "image.png": {
     "image/png": "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"
    }
   },
   "cell_type": "markdown",
   "id": "77fe5816",
   "metadata": {},
   "source": [
    "![image.png](attachment:image.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f7e5a0e0",
   "metadata": {},
   "source": [
    "### 消息产生"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "08ebcb99",
   "metadata": {},
   "source": [
    "上述公式即：通过头结点、尾节点和边的特征来产生消息，比如将头节点特征’el’和尾节点特征’er’相加得到消息特征’e’。对应的函数为："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "id": "af5b4cd7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<dgl.function.message.BinaryMessageFunction at 0x22b543dcd90>"
      ]
     },
     "execution_count": 96,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dgl.function.u_add_v('el', 'er', 'e')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4aace675",
   "metadata": {},
   "source": [
    "实际使用时，即："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "id": "d03137c2",
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'graph' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "Cell \u001b[1;32mIn[97], line 2\u001b[0m\n\u001b[0;32m      1\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mdgl\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mfunction\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mfn\u001b[39;00m\n\u001b[1;32m----> 2\u001b[0m \u001b[43mgraph\u001b[49m\u001b[38;5;241m.\u001b[39mapply_edges(fn\u001b[38;5;241m.\u001b[39mu_add_v(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mel\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mer\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124me\u001b[39m\u001b[38;5;124m'\u001b[39m))\n\u001b[0;32m      3\u001b[0m \u001b[38;5;66;03m# or\u001b[39;00m\n\u001b[0;32m      4\u001b[0m graph\u001b[38;5;241m.\u001b[39mapply_edges(message_func)\n",
      "\u001b[1;31mNameError\u001b[0m: name 'graph' is not defined"
     ]
    }
   ],
   "source": [
    "import dgl.function as fn\n",
    "graph.apply_edges(fn.u_add_v('el', 'er', 'e'))\n",
    "# or\n",
    "graph.apply_edges(message_func)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0e991e79",
   "metadata": {},
   "source": [
    "它相当于："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "id": "24596780",
   "metadata": {},
   "outputs": [],
   "source": [
    "def message_func(edges):\n",
    "     return {'e': edges.src['el'] + edges.dst['er']}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "99b85349",
   "metadata": {},
   "source": [
    "### 消息聚合"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bba26b37",
   "metadata": {},
   "source": [
    "访问消息产生过程中存放在mailbox的消息，收集节点邻居发来的消息并处理。比如sum、max、min。\n",
    "\n",
    "例如，将mailbox中的消息’m’求和，传递给节点特征’h’。对应的函数为："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "id": "7e4a7f3c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<dgl.function.reducer.SimpleReduceFunction at 0x22b544cd760>"
      ]
     },
     "execution_count": 99,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dgl.function.sum('m', 'h')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c7e56220",
   "metadata": {},
   "source": [
    "也可以写成："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "id": "8f45af97",
   "metadata": {},
   "outputs": [],
   "source": [
    "def reduce_func(nodes):\n",
    "     return {'h': torch.sum(nodes.mailbox['m'], dim=1)}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "id": "e69313ed",
   "metadata": {},
   "outputs": [],
   "source": [
    "def message_func1(edges):\n",
    "    # edges.src 可以访问源点特征 \n",
    "    # edges.dst 可以访问目标点特征 \n",
    "    # edges.data 可以访问边的特征\n",
    "    return {'m':edges.src['feat']}\n",
    "\n",
    "def reduce_func1(nodes):\n",
    "    # nodes.data 可以访问到节点的特征\n",
    "    # nodes.mailbox 可以访问到节点收到的消息\n",
    "    return {'feat':nodes.mailbox['m'].sum(1)}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "id": "d51cb32d",
   "metadata": {},
   "outputs": [],
   "source": [
    "g1.update_all(message_func1,reduce_func1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "id": "349319ff",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'feat': tensor([[0.],\n",
       "        [3.],\n",
       "        [0.],\n",
       "        [1.]])}"
      ]
     },
     "execution_count": 104,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g1.ndata"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ad1001d8",
   "metadata": {},
   "source": [
    "### 更新特征"
   ]
  },
  {
   "attachments": {
    "image.png": {
     "image/png": "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"
    }
   },
   "cell_type": "markdown",
   "id": "6799bee2",
   "metadata": {},
   "source": [
    "![image.png](attachment:image.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "895430fe",
   "metadata": {},
   "source": [
    "即将前一时刻的节点特征与消息聚合后产生的特征融合起来，得到当前时刻节点的新特征。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7d06de40",
   "metadata": {},
   "source": [
    "要更新节点特征，需要用点update_all()函数。update_all()有三个参数：一个消息产生函数(message function)、一个消息聚合函数(reduce function)、一个更新函数(update function)。更新函数通常空着，在外部实现。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "id": "371d9d52",
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "import dgl.function as fn\n",
    "class GCNLayer(nn.Module):\n",
    "    def __init__(self):\n",
    "        super().__init__()\n",
    "        self.linear = nn.Linear(1,2)\n",
    "    def forward(self,g,feat):\n",
    "        with g.local_scope():\n",
    "            # H' = D^-(-1/2) A D^(-1/2) H W\n",
    "            feat = self.linear(feat)\n",
    "            deg = g.out_degrees().unsqueeze(1)\n",
    "            feat = torch.pow(deg,-0.5) * feat\n",
    "            g.ndata['feat'] = feat\n",
    "            g.update_all(fn.copy_u('feat','m'),fn.sum('m','feat'))\n",
    "            deg_in = g.in_degrees().unsqueeze(1)\n",
    "            new_feat = torch.pow(deg_in,-0.5) * g.ndata['feat']\n",
    "        return new_feat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "id": "9f9e753f",
   "metadata": {},
   "outputs": [],
   "source": [
    "layer = GCNLayer()\n",
    "g = dgl.add_self_loop(g1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "id": "0877cd6a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Graph(num_nodes=4, num_edges=8,\n",
       "      ndata_schemes={'feat': Scheme(shape=(1,), dtype=torch.float32)}\n",
       "      edata_schemes={})"
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "id": "64188939",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[1., 1., 0., 1.],\n",
       "        [0., 1., 0., 0.],\n",
       "        [0., 1., 1., 0.],\n",
       "        [0., 1., 0., 1.]])"
      ]
     },
     "execution_count": 110,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "g.adj().to_dense()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "id": "4fd6df4c",
   "metadata": {},
   "outputs": [],
   "source": [
    "feat = layer(g,torch.ones(4,1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "id": "e284a41b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[-0.9413,  0.2424],\n",
       "        [-2.4388,  0.6279],\n",
       "        [-1.1529,  0.2968],\n",
       "        [-1.4808,  0.3813]], grad_fn=<MulBackward0>)"
      ]
     },
     "execution_count": 112,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "feat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d31f4f9a",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "DGL",
   "language": "python",
   "name": "dgl"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.19"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
